<?php
/**
 * @author jonathan <jo.link.noir@gmail.com>
 * @version 1.0: jo_link_noir
 * @date 08-01-2010
 */
class U1_Account_Connexion extends SF_Form
{
	/**
	 * Redirige vers la page de jeux
	 * @param stdClass|SW_Player $user : {sid:string, player:SW_Player}|SW_Player
	 * @param bool|null|string $location = null : utilisé pour self::localisation, si false, non prit en compte
	 * @return bool
	 */
	static public function connect($user, $location = null)
	{
		if ($user instanceof stdClass)
		{
			session_start();
			self::disconnect();
			if (!empty($user->sid))
				session_id($user->sid);
			$player = $user->player;
		}
		elseif ($user instanceof SW_Player)
			$player = $user;
		else
			throw new InvalidArgumentException('La valeur attendu est un objet SW_Player ou stdClass:{sid:string, player:SW_Player}');
		session_start();

		if (!U1_DAO_User::connect($player, session_id()))
			return false;

		$_SESSION['player'] = $player;

		if (false !== $location)
			self::localisation($location);

		return true;
	}

	/**
	 * @param true|null|string $location : Définit comment est utiliser le header, si null self::localisation est envoyer au header puis exit. Si true exit n'est pas executer. Sinon localisation est une url et header et lancé ainsi que exit.
	 * @return bool
	 */
	static public function localisation($location)
	{
		$header = ($location && true !== $location) ? $location : 'http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['SCRIPT_NAME']).'/U1/index.php';
		header('Location: '.$header);
		if (true !== $location)
			exit;
	}

	static public function disconnect()
	{
		if (isset($_SESSION))
		{
			$_SESSION = array();

			//efface le cookie de session
			if (ini_get('session.use_cookies'))
			{
				$params = session_get_cookie_params();
				setcookie(session_name(), '', 0,
					$params['path'], $params['domain'],
					$params['secure'], $params['httponly']
				);
			}

			//finalement, on détruit la session.
			session_destroy();
			session_write_close();
		}
	}

	/**
	* Crée un formulaire avec la méthode post.
	* @param string $action = self::DEFAULT_ACTION
	*/
	public function __construct($action = self::DEFAULT_ACTION)
	{
		parent::__construct('post', $action);
	}

	public function init()
	{
		$this->addElement(new SF_Form_Element_Text('mail'))
		->addElement(new SF_Form_Element_Password('password'));
	}

	/**
	* Retourne true si le formulaire à été valider.
	* @param array $values = null
	* @return bool
	*/
	public function isSubmit(array $values = null)
	{
		return $values ? isset($values['connexion']) : isset($_POST['connexion']);
	}

	/**
	 * Utilise self::connect()
	 * @return bool
	 */
	public function open()
	{
		$o = U1_DAO_User::selectConnect(
			$this->elements['mail']->getUnfilteredValue(),
			$this->elements['password']->getUnfilteredValue()
		);
		if (null === $o)
			return false;

		return self::connect($o);
	}
}